package com.oa.overtime.service;

import java.util.Map;

import org.activiti.engine.runtime.ProcessInstance;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;

import com.oa.overtime.dto.OvertimeDTO;
import com.oa.overtime.entity.Overtime;

public interface IOvertimeService {
	// 加班业务
	public void save(OvertimeDTO overtimeDTO);
	public void delete(Long id);
	public Overtime findOne(Long id);
	public Page<OvertimeDTO> findOvertimeForm(String name, Pageable pageable);
	public Page<OvertimeDTO> findAll(Pageable pageable);
	public OvertimeDTO findOneDTO(Long id) ;

	public Page<OvertimeDTO> findOvertimeForm(Specification<Overtime> specification, Pageable pageable);

	/**
	 * ----------------------------------------工作流业务------------------------------------------
	 */
	/**
	 * 启动一个部署好的加班流程
	 * 
	 * @param overtimeId 	用于启动流程的加班申请表ID，不能为空
	 * @param variables 	流程变量，需要有3个键值对："applyUserId":Long,"depManager","depManagerID"
	 * @return 启动的流程实例
	 */
	public ProcessInstance starProcess(Long overtimeId, Map<String, Object> variables);
	
	/**
	 * 查找当前用户待完成的流程任务
	 * @param userId	当前用户的ID
	 * @param pageable	
	 * @return	查找到的加班申请表
	 */
	public Page<OvertimeDTO> findTodoTask(Long userId, Pageable pageable);
	
	/**
	 * 流程任务签收
	 * @param taskId	签收的流程任务ID
	 * @param userId	签收的用户Id
	 */
	public void claim(String taskId, Long userId);
	
	/**
	 * 流程任务完成
	 * @param dto		保存提交表单信息的DTO
	 * @param variables	流程完成需要的变量
	 */
	public void complete(OvertimeDTO dto, Map<String, Object> variables);

	/**
	 * 判断流程是否正在进行
	 * 
	 * @param ProcessInstanceId	判断的流程实例ID
	 * @return
	 */
	public boolean isProcessInstanceActive(String ProcessInstanceId);
	
	/**
	 * 判断流程实例是否已存在
	 * @param ProcessInstanceId	判断的流程实例ID
	 * @return
	 */
	public boolean isProcessInstanceExist(String ProcessInstanceId);
	
	/**
	 * 查询待归档的表单
	 * @param userId	当前用户的用户Id
	 * @param pageable	
	 * @return	查询得到的OvertimeDTO集合
	 */
	public Page<OvertimeDTO> findToFileForm(Long userId,Pageable pageable);
	
	/**
	 * 完成人事部归档流程任务
	 * @param dto	归档的表单数据
	 */
	public void overtimeFile(OvertimeDTO dto);
	
	/**
	 * 获取部门的经理
	 * @param detName 部门名称
	 * @return
	 */
	public String getDeptManager(String detName);

	/**
	 * 获取最新的加班表单信息
	 * @return
	 */
	public Page<OvertimeDTO> findLateForm();

	/**
	 * 导出excel表
	 * @param specification 查询条件
	 * @return
	 */
	public HSSFWorkbook export(Specification<Overtime> specification);
}
